﻿/*
 * Created by SharpDevelop.
 * User: CeCi
 * Date: 23/04/2014
 * Time: 07:13 p.m.
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using Gestión_UTN.Entities;

namespace Gestión_UTN.daimpl
{
    /// <summary>
    /// Description of aprobadadaimpl.
    /// </summary>
    public class aprobadadaimpl : da.aprobadada
    {
        public aprobadadaimpl()
        {
        }

        public bool SaveAprobada(int alu_dni, int mat_id, string nota, DateTime fecha)
        {
            bool ingresada = false;

            OleDbConnection conex = null;
            OleDbTransaction trans = null;

            try
            {
                conex = util.Conexion.conectarAccess();
                trans = null;

                if (null != conex)
                {

                    string sql = "INSERT INTO apr_aprobadas(alu_dni, mat_id, apr_nota, apr_fecha)" +
                        "VALUES(@alu_dni, @mat_id, @apr_nota, @apr_fecha)";

                    conex.Open();
                    trans = conex.BeginTransaction();

                    OleDbCommand insertar = new OleDbCommand(sql, conex, trans);

                    insertar.Parameters.AddWithValue("@alu_dni", alu_dni);
                    insertar.Parameters.AddWithValue("@mat_id", mat_id);
                    insertar.Parameters.AddWithValue("@apr_nota", nota);
                    insertar.Parameters.AddWithValue("@apr_fecha", fecha);

                    insertar.ExecuteNonQuery();

                    trans.Commit();

                    ingresada = true;

                    conex.Close();
                }

            }
            catch (Exception ex)
            {
                ingresada = false;
                trans.Rollback();
                conex.Close();

                throw new exceptions.daexception(ex.Message);
            }

            return ingresada;
        }

        public bool DeleteAprobada(int alu_dni, int mat_id, DateTime fecha)
        {
            bool eliminada = false;

            OleDbConnection conex = null;
            OleDbTransaction trans = null;

            try
            {
                conex = util.Conexion.conectarAccess();
                trans = null;

                if (null != conex)
                {

                    string sql = "DELETE FROM apr_aprobadas " +
                        "WHERE alu_dni = @alu_dni AND mat_id = @mat_id AND apr_fecha = @fecha";

                    conex.Open();

                    trans = conex.BeginTransaction();

                    OleDbCommand eliminar = new OleDbCommand(sql, conex, trans);

                    eliminar.Parameters.AddWithValue("@alu_dni", alu_dni);
                    eliminar.Parameters.AddWithValue("@mat_id", mat_id);
                    eliminar.Parameters.AddWithValue("@fecha", fecha);

                    eliminar.ExecuteNonQuery();

                    trans.Commit();

                    eliminada = true;

                    conex.Close();
                }

            }
            catch (Exception ex)
            {
                eliminada = false;
                trans.Rollback();
                conex.Close();

                throw new exceptions.daexception(ex.Message);
            }

            return eliminada;
        }

        public bool ModifyAprobada(int alu_dni_anterior, int mat_id_anterior, DateTime fecha_anterior, int alu_dni, int mat_id, string nota, DateTime fecha)
        {
            bool modificada = false;

            OleDbConnection conex = null;
            OleDbTransaction trans = null;

            try
            {
                conex = util.Conexion.conectarAccess();
                trans = null;

                if (null != conex)
                {

                    string sql = "UPDATE apr_aprobadas SET alu_dni = @alu_dni, mat_id = @mat_id, apr_nota = @apr_nota, apr_fecha = @fecha " +
                        "WHERE alu_dni = @alu_dni_anterior AND mat_id = @mat_id_anterior AND apr_fecha = @fecha_anterior";

                    conex.Open();
                    trans = conex.BeginTransaction();

                    OleDbCommand modificar = new OleDbCommand(sql, conex);

                    modificar.Parameters.AddWithValue("@alu_dni", alu_dni);
                    modificar.Parameters.AddWithValue("@mat_id", mat_id);
                    modificar.Parameters.AddWithValue("@apr_nota", nota);
                    modificar.Parameters.AddWithValue("@fecha", fecha);
                    modificar.Parameters.AddWithValue("@alu_dni_anterior", alu_dni_anterior);
                    modificar.Parameters.AddWithValue("@mat_id_anterior", mat_id_anterior);
                    modificar.Parameters.AddWithValue("@fecha_anterior", fecha_anterior);

                    modificar.ExecuteNonQuery();

                    trans.Commit();

                    modificada = true;

                    conex.Close();
                }

            }
            catch (Exception ex)
            {
                modificada = false;
                trans.Rollback();
                conex.Close();

                throw new exceptions.daexception(ex.Message);
            }

            return modificada;
        }

        public System.Data.DataTable FindAllAprobadas()
        {
            DataTable tablaAprobadas = null;

            OleDbConnection conex = null;

            try
            {
                conex = util.Conexion.conectarAccess();
                tablaAprobadas = new DataTable();

                if (null != conex)
                {

                    string sql = "SELECT alu_dni, alu_nombre, alu_apellido, mat_nombre, " +
                        "apr_nota, apr_fecha" +
                        " FROM apr_aprobadas apr, alu_alumnos alu, mat_materias mat, cur_cursadas cur" +
                        " WHERE apr.alu_dni = alu.alu_dni AND apr.mat_id = mat.mat_id";

                    OleDbDataAdapter adaptador = new OleDbDataAdapter(sql, conex);

                    conex.Open();

                    adaptador.Fill(tablaAprobadas);

                    conex.Close();
                }

            }
            catch (Exception ex)
            {
                tablaAprobadas = null;
                conex.Close();

                throw new exceptions.daexception(ex.Message);
            }

            return tablaAprobadas;
        }

        public System.Collections.Generic.List<Gestión_UTN.Entities.Aprobada> FindAprobadaByDni(int alu_dni)
        {
            List<Aprobada> aprobadas = null;

            OleDbConnection conex = null;

            try
            {
                conex = util.Conexion.conectarAccess();
                aprobadas = new List<Aprobada>();

                if (null != conex)
                {

                    string sql = "SELECT alu_dni, mat_id, apr_nota, apr_fecha " +
                        " FROM apr_aprobadas reg" +
                        " WHERE alu_dni = @alu_dni";

                    OleDbCommand consulta = new OleDbCommand(sql, conex);

                    conex.Open();

                    consulta.Parameters.AddWithValue("@alu_dni", alu_dni);

                    OleDbDataReader lector = consulta.ExecuteReader();

                    while (lector.Read())
                    {
                        int dni = Convert.ToInt32(lector[0].ToString());
                        int mat_id = Convert.ToInt32(lector[1].ToString());
                        string nota = lector[2].ToString();
                        DateTime fecha = Convert.ToDateTime(lector[3].ToString());

                        Aprobada apr = new Aprobada(dni, mat_id, nota, fecha);

                        aprobadas.Add(apr);

                        apr = null;
                    }

                    conex.Close();
                }

            }
            catch (Exception ex)
            {
                aprobadas = null;
                conex.Close();

                throw new exceptions.daexception(ex.Message);
            }

            return aprobadas;
        }

        public System.Collections.Generic.List<Gestión_UTN.Entities.Aprobada> FindAprobadaByMateria(int mat_id)
        {
            List<Aprobada> aprobadas = null;

            OleDbConnection conex = null;

            try
            {
                conex = util.Conexion.conectarAccess();
                aprobadas = new List<Aprobada>();

                if (null != conex)
                {

                    string sql = "SELECT alu_dni, mat_id, apr_nota, apr_fecha " +
                        " FROM apr_aprobadas apr" +
                        " WHERE mat_id = @mat_id";

                    OleDbCommand consulta = new OleDbCommand(sql, conex);

                    conex.Open();

                    consulta.Parameters.AddWithValue("@mat_id", mat_id);

                    OleDbDataReader lector = consulta.ExecuteReader();

                    while (lector.Read())
                    {
                        int dni = Convert.ToInt32(lector[0].ToString());
                        int mat = Convert.ToInt32(lector[1].ToString());
                        string nota = lector[2].ToString();
                        DateTime fecha = Convert.ToDateTime(lector[3].ToString());

                        Aprobada apr = new Aprobada(dni, mat, nota, fecha);

                        aprobadas.Add(apr);

                        apr = null;
                    }

                    conex.Close();
                }

            }
            catch (Exception ex)
            {
                aprobadas = null;
                conex.Close();

                throw new exceptions.daexception(ex.Message);
            }

            return aprobadas;
        }
    }
}
